import axios, { AxiosRequestConfig, AxiosRequestHeaders, AxiosResponse } from 'axios'
import store from '@/store'
import { Message } from 'element-ui'
import router from '@/router'
import qs from 'qs'

const request = axios.create({
  // 配置项
  // baseUrl
  // timeout
})

function gologin () {
  router.push({
    name: 'login',
    query: {
      redirect: router.currentRoute.fullPath
    }
  })
}
function refreshToken () {
  return axios.create()({
    url: '/front/user/refresh_token',
    method: 'POST',
    data: qs.stringify({
      refreshtoken: store.state.user.refresh_token
    })
  })
}
// 请求拦截器
request.interceptors.request.use((config: AxiosRequestConfig) => {
  const { user } = store.state
  if (user && user.access_token) {
    // eslint-disable-next-line @typescript-eslint/ban-ts-comment
    (config.headers as AxiosRequestHeaders).Authorization = user.access_token
  }
  return config
}, err => {
  return Promise.reject(err)
})

let isRedresh = false
let requestList: any[] = []
// 响应拦截器
request.interceptors.response.use((response: AxiosResponse) => { // 2xx 都会走这里
  return response
}, async err => { // 超出2xx 的代码都会走这里
  if (err.response) {
    const { status } = err.response
    // 请求时接收到响应，状态码不是2xx
    if (status === 400) {
      Message.error('请求参数错误')
    } else if (status === 401) {
      if (!store.state.user) {
        gologin()
      }

      if (!isRedresh) {
        isRedresh = true
        return refreshToken().then(res => {
          if (!res.data.success) {
            throw new Error('刷新Token失败')
          }
          store.commit('setUser', res.data.content)

          requestList.forEach(cb => cb())
          requestList = []
          return request(err.config)
        }).catch(err => {
          console.log(err)
          gologin()
          return Promise.reject(err)
        }).finally(() => {
          isRedresh = false
        })
      }

      return new Promise(resolve => {
        requestList.push(() => {
          resolve(request(err.config))
        })
      })
    } else if (status === 403) {
      Message.error('您没有权限，请联系管理员')
    } else if (status === 404) {
      Message.error('请求的资源不存在')
    } else if (status >= 500) {
      Message.error('服务端错误，请联系管理员')
    }
  } else if (err.request) {
    // 发送了请求未接收到响应
    Message.error('请求超时，请刷新重试')
  } else {
    // 在请求时发生了错误
    Message.error(`请求失败：${err.message}`)
  }

  // 将请求失败的错误对象抛出给上一个调用者
  return Promise.reject(err)
})

export default request
